﻿namespace CatDOTS.VoxelWorld
{
    //public enum FaceOffset : byte
    //{
    //    Top = 1 << 0,
    //    Right = 1 << 1,
    //    Bottom = 1 << 2,
    //    Left = 1 << 3,

    //    右上 = Top | Right,
    //}
    /// <summary>
    /// 定义Z方向的从-Z查看Z；X方向的从X到-X，Y方向的从Y到-Y，即全部从原点开始计算1到64
    /// </summary>
    public enum FaceRect : ulong
    {
        None = 0,
        Full = ~0ul,
        第一行单格 = R1 | R2 | R3 | R4 | R5 | R6 | R7 | R8,
        第二行单格 = 第一行单格 << 8,
        第三行单格 = 第二行单格 << 8,
        第四行单格 = 第三行单格 << 8,
        第五行单格 = 第四行单格 << 8,
        第六行单格 = 第五行单格 << 8,
        第七行单格 = 第六行单格 << 8,
        第八行单格 = 第七行单格 << 8,

        第一列单格 = R1 | R9 | R17 | R25 | R33 | R41 | R49 | R57,
        第二列单格 = 第一列单格 << 1,
        第三列单格 = 第二列单格 << 1,
        第四列单格 = 第三列单格 << 1,
        第五列单格 = 第四列单格 << 1,
        第六列单格 = 第五列单格 << 1,
        第七列单格 = 第六列单格 << 1,
        第八列单格 = 第七列单格 << 1,

        左下正十六 =
            R25 | R26 | R27 | R28
            | R17 | R18 | R19 | R20
            | R9 | R10 | R11 | R12
            | R1 | R2 | R3 | R4,
        右下正十六 = 左下正十六 << 4,
        左上正十六 = 右下正十六 << 28,
        右上正十六 = 左上正十六 << 4,

        左下正八 = R9 | R10 | R1 | R2,
        右下正八 = R15 | R16 | R7 | R8,
        左上正八 = R57 | R58 | R49 | R50,
        右上正八 = R63 | R64 | R55 | R56,


        下半长方体 = 左下正十六 | 右下正十六,
        上半长方体 = 左上正十六 | 右上正十六,
        左半长方体 = 左上正十六 | 左下正十六,
        右半长方体 = 右上正十六 | 右下正十六,

        第一行双格 = 第一行单格 | 第二行单格,
        第二行双格 = 第三行单格 | 第四行单格,
        第三行双格 = 第五行单格 | 第六行单格,
        第四行双格 = 第七行单格 | 第八行单格,

        第一列双格 = 第一列单格 | 第二列单格,
        第二列双格 = 第三列单格 | 第四列单格,
        第三列双格 = 第五列单格 | 第六列单格,
        第四列双格 = 第七列单格 | 第八列单格,

        二阶台阶左下 = 左上正十六 | 左下正十六 | 右下正十六,
        二阶台阶右下 = 右上正十六 | 右下正十六 | 左下正十六,
        二阶台阶左上 = 左上正十六 | 左下正十六 | 右上正十六,
        二阶台阶右上 = 右上正十六 | 右下正十六 | 左上正十六,

        伪内切圆 = Full ^ (R1 | R2 | R9 | R7 | R8 | R16 | R49 | R57 | R58 | R58 | R56 | R63 | R64),

        R1 = 1,
        R2 = 2,
        R3 = 4,
        R4 = 8,
        R5 = 16,
        R6 = 32,
        R7 = 64,
        R8 = 128,
        R9 = 256,
        R10 = 512,
        R11 = 1024,
        R12 = 2048,
        R13 = 4096,
        R14 = 8192,
        R15 = 16384,
        R16 = 32768,
        R17 = 65536,
        R18 = 131072,
        R19 = 262144,
        R20 = 524288,
        R21 = 1048576,
        R22 = 2097152,
        R23 = 4194304,
        R24 = 8388608,
        R25 = 16777216,
        R26 = 33554432,
        R27 = 67108864,
        R28 = 134217728,
        R29 = 268435456,
        R30 = 536870912,
        R31 = 1073741824,
        R32 = 2147483648,
        R33 = 4294967296,
        R34 = 8589934592,
        R35 = 17179869184,
        R36 = 34359738368,
        R37 = 68719476736,
        R38 = 137438953472,
        R39 = 274877906944,
        R40 = 549755813888,
        R41 = 1099511627776,
        R42 = 2199023255552,
        R43 = 4398046511104,
        R44 = 8796093022208,
        R45 = 17592186044416,
        R46 = 35184372088832,
        R47 = 70368744177664,
        R48 = 140737488355328,
        R49 = 281474976710656,
        R50 = 562949953421312,
        R51 = 1125899906842624,
        R52 = 2251799813685248,
        R53 = 4503599627370496,
        R54 = 9007199254740992,
        R55 = 18014398509481984,
        R56 = 36028797018963968,
        R57 = 72057594037927936,
        R58 = 144115188075855872,
        R59 = 288230376151711744,
        R60 = 576460752303423488,
        R61 = 1152921504606846976,
        R62 = 2305843009213693952,
        R63 = 4611686018427387904,
        R64 = 9223372036854775808,
    }
}